package com.zhugang.week01;


/**
 * @program algorithms
 * @description: 解析IP
 * @author: chanzhugang
 * @create: 2022/03/13 21:23
 */
public class IpAnaly {

    public static void main(String[] args) {
        IpAnaly ipAnaly = new IpAnaly();
        String ip = "123.92.2.34";
        boolean check = ipAnaly.check(ip);
        System.out.println(check);
    }


    /**
     * 给定一个字符串表示ip地址，比如："123.92.2.34"，判断是否合法。合法规则如下：
     * a、除了空格、数字和.之外，不得包含其他字符
     * b、ip地址由四个数字构成，有.分隔，每个.隔开的数字大小在0-255之间
     * c、数字前后可以有空格，但中间不能有空格。如"123 .92. 2. 34"合法，"12 3.9 2. 34"非法
     */
    public boolean check(String ip) {
        if (ip == null) {
            return false;
        }
        String[] ipSegments = ip.split("\\.");
        if (ipSegments.length != 4) {
            return false;
        }
        for (int i = 0; i < 4; i++) {
            boolean valid = checkSegment(ipSegments[i]);
            if (!valid) {
                return false;
            }
        }
        return true;
    }

    /**
     * 校验每一个子段
     *
     * @param ipSegment
     * @return
     */
    private boolean checkSegment(String ipSegment) {
        // 跳过前导空格: 如 " 123"
        int n = ipSegment.length();
        int i = 0;
        while (i < n && ipSegment.charAt(i) == ' ') {
            i++;
        }
        if (i == n) {
            // 全是空格
            return false;
        }
        // 处理数字:如 "123" -> 123
        int digit = 0;
        while (i < n && ipSegment.charAt(i) != ' ') {
            char c = ipSegment.charAt(i);
            if (c < '0' || c > '9') {
                // 非数字
                return false;
            }
            digit = digit * 10 + (c - '0');
            if (digit > 255) {
                return false;
            }
            i++;
        }
        // 处理后置空格: 如 "123 " or "12 3"
        while (i < n) {
            char c = ipSegment.charAt(i);
            if (c != ' ') {
                // 后面又有非空格字符
                return false;
            }
            i++;
        }
        return true;
    }
}